package com.fyakm.daodejing.simple;
import java.util.Random;

public class Species {
    private int[] genes; // 用整型数组模拟物种的基因结构，可以根据需要调整更复杂的数据结构

    public Species(int[] genes) {
        this.genes = genes.clone();
    }

    // 获取物种基因的方法
    public int[] getGenes() {
        return genes.clone();
    }

//    // 物种的变异方法，根据传入的变异概率来改变自身基因，实现变异效果
//    public void mutate(double mutationRate) {
//        Random random = new Random();
//        for (int i = 0; i < genes.length; i++) {
//            if (random.nextDouble() < mutationRate) {
//                // 简单示例，给基因值加上一个随机数来模拟变异，可优化变异逻辑
//                genes[i] += random.nextInt(10) - 5;
//            }
//        }
//    }


    // 计算该物种对于给定环境的适应度的方法，这里只是简单示例，根据基因与环境因素关系计算
    public double calculateFitness(Environment environment) {
        double fitness = 0;
        int[] genes = getGenes();
        // 假设基因的第一个值与适应温度有关，差值越小适应度越高
        fitness += Math.abs(genes[0] - environment.getTemperature());
        // 假设基因的第二个值与获取食物能力有关，差值越小适应度越高
        fitness += Math.abs(genes[1] - environment.getFoodAvailability());
        return 1 / (1 + fitness); // 简单转换为 0 - 1 之间的适应度值，值越大越适应
    }


    // 为每个基因设置不同的变异概率数组（示例中简单设定，可根据实际调整）
    private double[] mutationProbabilities = {0.05, 0.03, 0.02, 0.04, 0.01};
    // 为每个基因设置不同的变异范围（示例中简单设定，可根据实际调整）
    private int[] mutationRanges = {5, 3, 2, 4, 1};

    public void mutate(double mutationRate) {
        Random random = new Random();
        int[] genes = getGenes();
        for (int i = 0; i < genes.length; i++) {
            if (random.nextDouble() < mutationProbabilities[i] * mutationRate) {
                // 根据不同的变异范围进行变异操作，这里以在当前值基础上加上一个范围内的随机数为例
                genes[i] += random.nextInt(mutationRanges[i] * 2 + 1) - mutationRanges[i];
            }
        }
    }
}